const exp = require('express'),
    bodyParser = require('body-parser'),
    cookieParser = require('cookie-parser'),
    fs = require('fs'),
    multer = require('multer'),
    app = exp()
app.use(exp.static('www'))
app.use(bodyParser.urlencoded({ extended: true }))
app.use(cookieParser())

const storage = multer.diskStorage({
    destination: 'www/uploads',
    filename: function (req, file, callback) {
        var petname = req.cookies.petname
        callback(null, `${petname}.jpg`)
    }
}),
    uploads = multer({ storage })

/*--------------------登录--------------------*/

app.post('/api/user/signin', (req, res) => {
    var fileName = `users/${req.body.petname}.txt`

    function send(code, message) {
        res.status(200).json({ code, message })
    }

    fs.exists(fileName, exists => {
        if (exists) {
            fs.readFile(fileName, (err, data) => {
                if (err) {
                    send('file error', '抱歉，系统错误...')
                }
                else {
                    var user = JSON.parse(data)
                    if (user.password == req.body.password) {

                        res.cookie('petname', req.body.petname)
                        // 此处需要加密

                        send('success', '登录成功...')
                    }
                    else {
                        send('signin error', '用户名或密码错误！')
                    }
                }
            })
        }
        else {
            send('register error', '用户名未注册！')
        }
    })
})

/*--------------------退出--------------------*/

app.get('/api/user/signout', (req, res) => {
    res.clearCookie('petname')
    res.status(200).json({ code: 'success' })
})

/*--------------------提问--------------------*/

app.post('/ask', (req, res) => {
    var petname = req.cookies.petname

    function send(code, message) {
        res.status(200).json({ code, message })
    }

    if (!petname) {
        send('signin error', '请重新登录...')
        return
    }

    var time = new Date()

    req.body.petname = petname
    req.body.ip = req.ip
    req.body.time = time

    function saveFile() {
        var fileName = `questions/${time.getTime()}.txt`

        fs.appendFile(fileName, JSON.stringify(req.body), err => {
            if (err) {
                send('file error', '抱歉，系统错误...')
            }
            else {
                send('success', '问题提交成功！')
            }
        })
    }

    fs.exists('questions', exists => {
        if (exists) {
            saveFile()
        }
        else {
            fs.mkdir('questions', err => {
                if (err) {
                    send('file error', '抱歉，系统错误...')
                }
                else {
                    saveFile()
                }
            })
        }
    })
})

/*--------------------回答--------------------*/

app.post('/answer/:id', (req, res) => {
    var petname = req.cookies.petname

    function send(code, message) {
        res.status(200).json({ code, message })
    }

    if (!petname) {
        send('signin error', '请重新登录...')
        return
    }
    console.log(req.body)
    var filename = `questions/${req.params.id}.txt`

    req.body.petname = petname
    req.body.ip = req.ip
    req.body.time = new Date()

    fs.readFile(filename, (err, data) => {
        if (err) {
            send('file error', '抱歉，系统错误...')
        }
        else {
            var question = JSON.parse(data)
            // 第1次回答时，问题里没有answers这个数组，所以添加
            // 以后的每一次直接向answers里push
            if (!question.answers) question.answers = []

            question.answers.push(req.body)
            // 经过上一句的代码，文件里既有问题又有答案
            fs.writeFile(filename, JSON.stringify(question), err => {
                if (err) {
                    send('file error', '抱歉，系统错误...')
                }
                else {
                    send('success', '回答提交成功！')
                }
            })
        }
    })
})


/*--------------------头像--------------------*/

app.post('/user/photo', uploads.single('photo'), (req, res) => {
    res.status(200).json({ code: 'success', message: '上传成功' })
})

/*--------------------首页--------------------*/

app.get('/index', (req, res) => {

    function send(code, message, data) {
        res.status(200).json({ code, message, data })
    }

    function readFiles(i, files, questions, complete) {
        // 第1次传参：0，['123.txt','234.txt'], [], ()
        if (i < files.length) {
            // 在if分支里调用fs里的readFile读取文件内容
            fs.readFile(`questions/${files[i]}`, (err, data) => {
                if (!err) {
                    // 读完第1个文件内容后，questions是以下的形式
                    // [{...}]
                    // 读完第2个文件内容后，questions是以下的形式
                    // [{...},{...}]
                    questions.push(JSON.parse(data))
                }
                // 递归调用(自身调用自身)
                readFiles(++i, files, questions, complete)
            })
        }
        // 直到读完最后一个文件内容会执行else分支
        else {
            // 读完后的回调函数
            // 作用是把读取的所有内容返回到浏览器端
            complete()
        }
    }
    // readdir：读取目录下的所有文件（注意：不是读文件内容）
    // 读取的结果是所有文件名组成的数组
    // 例如：['zhangsan.txt','lisi.txt']
    fs.readdir('questions', (err, files) => {
        if (err) {
            send('file error', '抱歉，系统错误...')
        }
        else {
            console.log(files)
            // reverse()：反转数组
            // 目的：把最新的问题和答案显示在最上面
            files = files.reverse()
            var questions = []
            // readFiles：自定义函数
            readFiles(0, files, questions, () => {
                send('success', '读取数据成功！', questions)
            })
        }
    })
})

app.listen(3000, () => console.log('正在运行...'))